package com.utils;

public class cHighTimer
{

	public cHighTimer()
	{

		
	}

	 public void start_counter()
	{
		init_point1();
	}

	
	/**
	 * // 返回时间单位：毫秒	
	// 都是相对上次调用get_elapsed_time()的时间差
	 * @return
	 */
	public float get_elapsed_time()
	{
		init_point2();
		float temp = 
			(float)(mCurrentTime - mStartTime) / 1000000.0f; // 转成以毫秒为单位 
	
		update_point();

		return temp;
	}

	
	private long FrameCounter;
	private float Second;
	// 接受逝去的时间
	public float get_fps(float elapsed)
	{
		FrameCounter++; //帧计数增加
		Second +=elapsed; //用时增加
		if( Second > 1000.0f)
		{
			mFPS =FrameCounter;// 得到FPS
			FrameCounter =0;
			Second =0;
		}

		return mFPS;
	}

	
	
	float mTime =0;
	public boolean controlFPS_Return(float elapsed, float fps){
		float FramePerMillSecond = 1000 / fps; // 控制一帧所使用的时间 
		mTime +=elapsed;
		
	//	System.out.println("mTime: "+mTime +"  FramePerMillSecond: "+FramePerMillSecond);
		
		if(mTime < FramePerMillSecond){ // 控制在范围内
			return false;
		}
		else{
			mTime =0;
			return true;
		}
	}
	

	/**
	 * 	// 将主循环控制在一定帧内
	// 比如：传进来33，则将循环控制在每秒中执行33次
	 * @param elapsed
	 * @param FPS
	 */
	public void controlFPS(float elapsed, float FPS)
	{
		float Time =0;
		float FramePerMillSecond = 60*1000 / FPS; // 控制一帧所使用的时间 
		Time +=elapsed;
		while(Time < FramePerMillSecond){ // 控制在范围内
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			Time +=elapsed;  //  
		}
		
		
	}
	
	
	/**
	 * 
	 * @param elapsed
	 * @param ms
	 */
	public void controlInTime(float elapsed, float ms)
	{
		float Time =0;
		while(Time < ms){ // 控制在范围内
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			Time +=elapsed;  // 
		}
		
		
	}
	

private
	void init_point1()
	{
		
		//使用高精度计时器，得到第一个计数
		mStartTime =System.nanoTime();
	}
private
	void init_point2()
	{
		// 得到第二个计数
		mCurrentTime = System.nanoTime();  
	}

	// 更新并交换数据
private	void update_point()
	{
		mStartTime = mCurrentTime;
	}

	private static long mStartTime;
	private static long mCurrentTime;
	
	private static float mFPS;
	

};

